在使用 python 轉換 xls 格式到 xlsx 我遇到了下列情況
1.有開啟密碼保護
2.唯讀密碼保護
3.有開啟密碼保護+唯讀密嗎保護
4.檔案含有vba
每當 python 遇到前三項, 都會出現一個視窗等待輸入密碼
但不見得所有的密碼都一樣, 或是遇到惡意設定的開啟密碼保護, 此時需要跳過有開啟密碼保護的檔案,
而唯讀密碼比較沒有關係, 然後還要檢查檔案內是否含有 vba, 存檔時以正確的格式存檔
相信版上也有很多大神都能順利解決這些問題, 但對我們這些入門者卻是很困擾, 順便讓我自己記錄一下
以下方式可以把每個檢測功能寫成 def , 這部份我就不多寫了, 因為我是使用 win32com , 所以參數請自行參考微軟的 win32com 手冊
好像 openpyxl 更簡單一點
目前我試過的方式如下
"""
檢測 xls 是否有開啟密碼保護
workbooks.open()文件請參考:
[https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open](https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open)
"""
import os
import win32com.client
#檔案路徑自請自行修改
FILE_NAME = r"D:\xls2xlsx\testFile\開啟密碼.xls"
READ_ONLY = False
EXCEL_FILE = win32com.client.Dispatch("Excel.Application")
try:
WORK_BOOK = EXCEL_FILE.Workbooks.Open(FILE_NAME, False, True, None, "", "", True, None, None, False, False, None, True)
print("檔案沒有開啟密碼保護")
except:
READ_FILE = True
print("檔案有開啟密碼保護")
finally:
#try 結束的動作
WORK_BOOK.Close()
EXCEL_FILE.Quit()
"""
檢測 xls 是否有唯讀密碼
workbooks.open()文件請參考:
[https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open](https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open)
"""
import os
import win32com.client
#檔案路徑自請自行修改
FILE_NAME = r"D:\xls2xlsx\testFile\唯讀密碼.xls"
READ_ONLY = False
EXCEL_FILE = win32com.client.Dispatch("Excel.Application")
try:
WORK_BOOK = EXCEL_FILE.Workbooks.Open(FILE_NAME, False, False, None, "", "", False, None, None, True, False, None, True)
print("檔案沒有唯讀密碼")
except:
READ_FILE = True
print("檔案有唯讀密碼")
finally:
#try 結束的動作
WORK_BOOK.Close()
EXCEL_FILE.Quit()
"""
檢測 xls 是否有VBA
workbooks.open()文件請參考:
[https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open](https://learn.microsoft.com/en-us/office/vba/api/excel.workbooks.open)
"""
import os
import win32com.client
#檔案路徑自請自行修改
FILE_NAME = r"D:\xls2xlsx\testFile\唯讀密碼.xls"
READ_ONLY = False
IS_VBA = False
EXCEL_FILE = win32com.client.Dispatch("Excel.Application")
WORK_BOOK = EXCEL_FILE.Workbooks.Open(FILE_NAME, False, False, None, "", "", False, None, None, True, False, None, True)
IS_VBA = WORK_BOOK.hasVBProject
SEC_VALUE = WORK_BOOK.Application.AutomationSecurity
WORK_BOOK.Application.AutomationSecurity = 1
if IS_VBA:
print("另存成 xlsm")
else:
print("# 另存成 xlsx")
WORK_BOOK.Application.AutomationSecurity = SEC_VALUE
WORK_BOOK.Close()
EXCEL_FILE.Quit()